package br.com.advocacia.faces;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import br.com.advocacia.entidade.AreaProcessual;
import br.com.advocacia.entidade.AssuntoJurisprudencia;
import br.com.advocacia.entidade.Instancia;
import br.com.advocacia.entidade.Jurisprudencia;
import br.com.advocacia.logica.contract.DefaultLogicaContract;
import br.com.advocacia.util.FacesUtil;
import br.com.advocacia.util.StringUtil;

@ManagedBean(name = "jurisprudenciaFaces")
@ViewScoped
public class JurisprudenciaFaces extends FacesUtil {

	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Jurisprudencia> logicaJurisprudencia;

	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<Instancia> logicaInstancia;
	
	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<AreaProcessual> logicaAreaProcessual;
	
	@ManagedProperty(value = "#{logicaDefault}")
	private DefaultLogicaContract<AssuntoJurisprudencia> logicaAssuntoJurisprudencia;
	
	private Jurisprudencia jurisprudencia = new Jurisprudencia();
	private List<Jurisprudencia> listaJurisprudencia = new ArrayList<>();
	
	private List<AssuntoJurisprudencia> listaAssuntoJurisprudencia = new ArrayList<>();
	private List<AreaProcessual> listaAreaProcessual = new ArrayList<>();
	private List<Instancia> listaInstancia = new ArrayList<>();

	/** CAMPOS DE PESQUISA */
	private String nomeJurisprudencia;

	@PostConstruct
	public void init() {
		this.popularComboAssunto();
		this.popularComboInstancia();
		this.popularAreaProcessual();
	}

	public void adicionar() {
		try {
			if (validaCampos()) {
				logicaJurisprudencia.adicionar(jurisprudencia);
				adicionarMensagem("Jurisprudencia adicionada com sucesso");
				this.buscarJurisprudencia();
				fecharModal("dialogJurisprudencia");
			} else {
				return;
			}

		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao adicionar a Jurisprudencia");
		}
	}

	public void prepararAdicionar() {
		this.jurisprudencia = new Jurisprudencia();
		abrirModal("dialogJurisprudencia");
	}

	public void selecionarRegistro(Long idJurisprudencia, boolean editar) {
		try {
			this.jurisprudencia = logicaJurisprudencia.obterPorId(Jurisprudencia.class, idJurisprudencia);
			if (editar) {
				abrirModal("dialogJurisprudencia");
			} else {
				abrirModal("dialogExcluir");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public void editar() {
		try {
			if (validaCampos()) {
				logicaJurisprudencia.editar(this.jurisprudencia);
				adicionarMensagem("Jurisprudencia editada com sucesso");
				fecharModal("dialogJurisprudencia");
				this.buscarJurisprudencia();
			} else {
				return;
			}

		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao editar a Jurisprudencia");
		}
	}

	public void remover() {
		try {
			logicaJurisprudencia.remover(Jurisprudencia.class,
					this.jurisprudencia.getId());
			adicionarMensagem("Jurisprudencia removida com sucesso");
			fecharModal("dialogExcluir");
			this.buscarJurisprudencia();
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao remover a Jurisprudencia");
		}
	}

	public void buscarJurisprudencia() {
		if (listaJurisprudencia != null) {
			this.listaJurisprudencia.clear();
		}

		try {
			if (!StringUtil.textoPreenchido(nomeJurisprudencia)) {
				this.listaJurisprudencia = logicaJurisprudencia.buscarTodos(Jurisprudencia.class, "materia");
			} else {
				this.listaJurisprudencia = logicaJurisprudencia.buscarPorCampo(Jurisprudencia.class, "materia", nomeJurisprudencia);
			}
		} catch (Exception e) {
			adicionarMensagem("Houve um erro ao buscar as informações");
		}
	}
	
	private void popularComboAssunto() {
		try {
			listaAssuntoJurisprudencia =  logicaAssuntoJurisprudencia.buscarTodos(AssuntoJurisprudencia.class, "assunto");
		} catch (Exception e) {
			System.out.println("Erro ao obter os assuntos");
		}
	}

	private void popularComboInstancia() {
		try {
			listaInstancia =  logicaInstancia.buscarTodos(Instancia.class, "instancia");
		} catch (Exception e) {
			System.out.println("Erro ao obter as instancias");
		}
	}
	
	private void popularAreaProcessual() {
		try {
			listaAreaProcessual =  logicaAreaProcessual.buscarTodos(AreaProcessual.class, "area");
		} catch (Exception e) {
			System.out.println("Erro ao obter as Áreas Processuais");
		}
	}
	
	public boolean validaCampos() {
		boolean valido = true;

		if (!StringUtil.textoPreenchido(this.jurisprudencia.getMateria())) {
			adicionarMensagem("O campo matéria é obrigatório");
			valido = false;
		}
		return valido;
	}

	public Jurisprudencia getJurisprudencia() {
		return jurisprudencia;
	}

	public void setJurisprudencia(Jurisprudencia jurisprudencia) {
		this.jurisprudencia = jurisprudencia;
	}

	public List<Jurisprudencia> getListaJurisprudencia() {
		return listaJurisprudencia;
	}

	public void setListaJurisprudencia(List<Jurisprudencia> listaJurisprudencia) {
		this.listaJurisprudencia = listaJurisprudencia;
	}

	public String getNomeJurisprudencia() {
		return nomeJurisprudencia;
	}

	public void setNomeJurisprudencia(String nomeJurisprudencia) {
		this.nomeJurisprudencia = nomeJurisprudencia;
	}

	public void setLogicaJurisprudencia(
			DefaultLogicaContract<Jurisprudencia> logicaJurisprudencia) {
		this.logicaJurisprudencia = logicaJurisprudencia;
	}

	public List<AssuntoJurisprudencia> getListaAssuntoJurisprudencia() {
		return listaAssuntoJurisprudencia;
	}

	public void setListaAssuntoJurisprudencia(List<AssuntoJurisprudencia> listaAssuntoJurisprudencia) {
		this.listaAssuntoJurisprudencia = listaAssuntoJurisprudencia;
	}

	public void setLogicaAssuntoJurisprudencia(DefaultLogicaContract<AssuntoJurisprudencia> logicaAssuntoJurisprudencia) {
		this.logicaAssuntoJurisprudencia = logicaAssuntoJurisprudencia;
	}

	public List<AreaProcessual> getListaAreaProcessual() {
		return listaAreaProcessual;
	}

	public void setListaAreaProcessual(List<AreaProcessual> listaAreaProcessual) {
		this.listaAreaProcessual = listaAreaProcessual;
	}

	public List<Instancia> getListaInstancia() {
		return listaInstancia;
	}

	public void setListaInstancia(List<Instancia> listaInstancia) {
		this.listaInstancia = listaInstancia;
	}

	public void setLogicaInstancia(DefaultLogicaContract<Instancia> logicaInstancia) {
		this.logicaInstancia = logicaInstancia;
	}

	public void setLogicaAreaProcessual(DefaultLogicaContract<AreaProcessual> logicaAreaProcessual) {
		this.logicaAreaProcessual = logicaAreaProcessual;
	}
	
	
	
}